iT邦幫忙

DAY 8
1

Android 探索之備忘錄系列 第 8

Android 探索之備忘錄 [Day8-Wakelock]

  • 分享至 

  • xImage
  •  

在Android app or framework, 如果不想讓系統進入suspend(休眠)狀態的話,
就必須取得wakelock(喚醒鎖), 並且要小心管理wakelock, 一旦沒有釋放wakelock的話
系統就會處在無法suspend的狀態, 大大的增加耗電的速度!

Android SDK官網也有特別強調:
Device battery life will be significantly affected by the use of this API. Do not acquire PowerManager.WakeLocks unless you really need them, use the minimum levels possible, and be sure to release them as soon as possible.

意思就是沒事不要亂取wakelock,

取了也盡量用最小level的wakelock,

並且盡快釋放wakelock.

否則app被user討厭可不要怪我沒警告(這句是我自己加的XD)

從Android SDK官網可以看到wakelock分成四種

  1. PARTIAL_WAKE_LOCK
    讓CPU持續運行, 但不讓螢幕或鍵盤背光亮起
  2. SCREEN_DIM_WAKE_LOCK
    點亮螢幕, 但只有灰暗程度
  3. SCREEN_BRIGHT_WAKE_LOCK
    點亮螢幕, 亮度全開
  4. FULL_WAKE_LOCK
    點亮螢幕和鍵盤背光, 亮度全開

要讓app使用wakelock必須在AndroidManifest.xml增加宣告權限

<uses-permission android:name="android.permission.WAKE_LOCK" />

使用方式:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"MyWakelockTag");
wakeLock.acquire();
// do something
wakelock.release();

其中2,3,4在最新的SDK都已經被列為deprecated, 希望開發者改以以下方式來保持螢幕開啟

in Activity:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

or, in layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
...
</RelativeLayout>

這種方式的好處在於不需要取得特別權限也可以使用,並且當app切換時會由系統來管理該flag的存亡與否.

使用wakelock的時機大多在於需要不被系統突如其來的休眠打斷正在執行的任務,

除非確定系統休眠會造成影響, 否則應該盡量避免使用才是!


上一篇
Android 探索之備忘錄 [Day7-iBeacon]
下一篇
Android 探索之備忘錄 [Day9-JDGUI and DEX2JAR]
系列文
Android 探索之備忘錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言